#ifndef HAL_NRF_H__
#define HAL_NRF_H__

#include <stdint.h>
#include <stdbool.h>

#include "hal_nrf_reg.h"
#include "nrf_port.h"


// ==================================================================
/// @brief  : 开启或关闭指定中断源
///
/// @param  : int_source nrf中断源
/// @param  : irq_state 开启或关闭，ture 是打开，false是关闭
// ==================================================================
void hal_nrf_set_irq_mode(hal_nrf_irq_source_t int_source, bool irq_state);

// ==================================================================
/// @brief  : 启用动态包长度
///
/// @param  : enable 开启或关闭，ture 是打开，false是关闭
// ==================================================================
void hal_nrf_enable_dynamic_payload(bool enable);

// ==================================================================
/// @brief  : 启用ACK有效负载
///
/// @param  : enable 开启或关闭，ture 是打开，false是关闭
// ==================================================================
void hal_nrf_enable_ack_payload(bool enable);

// ==================================================================
/// @brief  : 启用动态ack 
///
/// @param  : enable 开启或关闭，ture 是打开，false是关闭
// ==================================================================
void hal_nrf_enable_dynamic_ack(bool enable);

// ==================================================================
/// @brief  : 设置动态载荷
///
/// @param  : 设置哪些pip来启用动态负载大小
// ==================================================================
void hal_nrf_setup_dynamic_payload(uint8_t setup);

// ==================================================================
/// @brief  : 读取接收到的ack有效负载的有效数据长度
///
/// @returns: 有效载荷长度
// ==================================================================
uint8_t hal_nrf_read_rx_payload_width(void);

// ==================================================================
/// @brief  : 写ack载荷
///
/// @param  : pipe 管道值
/// @param  : tx_pload 数据
/// @param  : length 长度
// ==================================================================
void hal_nrf_write_ack_payload(uint8_t pipe, const uint8_t *tx_pload, uint8_t length);

// ==================================================================
/// @brief  : 读取然后清除所有中断标志
///
/// @returns: 0x10 Max Retransmit interrupt
/// @returns: 0x20 TX Data sent interrupt
/// @returns: 0x40 RX Data received interrupt
// ==================================================================
uint8_t hal_nrf_get_clear_irq_flags(void);

// ==================================================================
/// @brief  : 清除所有中断标志
///
/// @returns: 清除的状态
// ==================================================================
uint8_t hal_nrf_clear_irq_flags_get_status(void);

// ==================================================================
/// @brief  : 清除指定中断
///
/// @param  : int_source 指定中断源
// ==================================================================
void hal_nrf_clear_irq_flag(hal_nrf_irq_source_t int_source);

// ==================================================================
/// @brief  : 设置nrf使用的CRC模式。
///
/// @param  : crc_mode crc模式
// ==================================================================
void hal_nrf_set_crc_mode(hal_nrf_crc_mode_t crc_mode);

// ==================================================================
/// @brief  : 打开nrf管道，启用/禁用自动应答
///
/// @param  : pipe_num 指定pipe
/// @param  : auto_ack 是否使能ack
// ==================================================================
void hal_nrf_open_pipe(hal_nrf_address_t pipe_num, bool auto_ack);

// ==================================================================
/// @brief  : 关闭nrf指定pipe
///
/// @param  : pipe_num 指定pipe
// ==================================================================
void hal_nrf_close_pipe(hal_nrf_address_t pipe_num);

// ==================================================================
/// @brief  : 设置nrf的地址
///
/// @param  : address 地址类型
/// @param  : addr 地址
// ==================================================================
void hal_nrf_set_address(const hal_nrf_address_t address, const uint8_t *addr);

// ==================================================================
/// @brief  : 获取地址
///
/// @param  : address address 地址类型
/// @param  : addr 读地址缓存
///
/// @returns: 复制到addr的字节数
// ==================================================================
uint8_t hal_nrf_get_address (uint8_t address, uint8_t *addr);

// ==================================================================
/// @brief  : 设置自动应答参数
///
/// @param  : retr 重发次数，0->代表不重发
/// @param  : delay 重发延时us
// ==================================================================
void hal_nrf_set_auto_retr(uint8_t retr, uint16_t delay);

// ==================================================================
/// @brief  : 设置nrf的地址宽度。
///
/// @param  : address_width 地址宽度
// ==================================================================
void hal_nrf_set_address_width(hal_nrf_address_width_t address_width);

// ==================================================================
/// @brief  : 获取nrf的地址宽度。
///
/// @returns: 地址宽度
// ==================================================================
uint8_t hal_nrf_get_address_width (void);

// ==================================================================
/// @brief  : 设置所选管道的有效载荷宽度
///
/// @param  : pipe_num 指定pipe
/// @param  : pload_width 地址宽度
// ==================================================================
void hal_nrf_set_rx_payload_width(uint8_t pipe_num, uint8_t pload_width);

// ==================================================================
/// @brief  : 读取所有的中断标志
///
/// @returns: 0x10 Max Retransmit interrupt
/// @returns: 0x20 TX Data sent interrupt
/// @returns: 0x40 RX Data received interrupt
// ==================================================================
uint8_t hal_nrf_get_irq_flags(void);

// ==================================================================
/// @brief  : 获取pipe状态
///
/// @param  : pipe_num 指定pipe
///
/// @returns: 0x00 Pipe is closed, autoack disabled
/// @returns: 0x01 Pipe is open, autoack disabled
/// @returns: 0x03 Pipe is open, autoack enabled
// ==================================================================
uint8_t hal_nrf_get_pipe_status(uint8_t pipe_num);

// ==================================================================
/// @brief  : 获取自动重传参数
///
/// @returns: 重发寄存器的值
// ==================================================================
uint8_t hal_nrf_get_auto_retr_status(void);

// ==================================================================
/// @brief  : 获取包丢失计数器
///
/// @returns: 数据包丢失的计数器
// ==================================================================
uint8_t hal_nrf_get_packet_lost_ctr(void);

// ==================================================================
/// @brief  : 获取选定管道的RX有效载荷宽度。
///
/// @param  : pipe_num 指定pipe
///
/// @returns: 载荷长度
// ==================================================================
uint8_t hal_nrf_get_rx_payload_width(uint8_t pipe_num);

// ==================================================================
/// @brief  : 设置操作模式
///
/// @param  : op_mode TX or RX
// ==================================================================
void hal_nrf_set_operation_mode(hal_nrf_operation_mode_t op_mode);

// ==================================================================
/// @brief  : 设置nrf的电源模式
///
/// @param  : pwr_mode 开或关电源
// ==================================================================
void hal_nrf_set_power_mode(hal_nrf_pwr_mode_t pwr_mode);

// ==================================================================
/// @brief  : 设置无线电射频频道
///
/// @param  : channel 指定频道
// ==================================================================
void hal_nrf_set_rf_channel(uint8_t channel);

// ==================================================================
/// @brief  : 设置收音机的TX输出功率
///
/// @param  : power 输出功率
// ==================================================================
void hal_nrf_set_output_power(hal_nrf_output_power_t power);

// ==================================================================
/// @brief  : 设置nrf空中传输速率
///
/// @param  : datarate 指定速率
// ==================================================================
void hal_nrf_set_datarate(hal_nrf_datarate_t datarate);

// ==================================================================
/// @brief  : 获取TX FIFO的状态
///
/// @returns: 0x00 TX FIFO NOT empty, but NOT full
/// @returns: 0x01 FIFO empty
/// @returns: 0x02 FIFO full
// ==================================================================
uint8_t hal_nrf_get_tx_fifo_status(void);

// ==================================================================
/// @brief  : 检测TX FIFO是否为空
///
/// @returns: FALSE TX FIFO NOT empty,TRUE TX FIFO empty
// ==================================================================
bool hal_nrf_tx_fifo_empty(void);

// ==================================================================
/// @brief  : 检测TX FIFO是否满了
///
/// @returns: FALSE TX FIFO NOT full,TRUE TX FIFO full
// ==================================================================
bool hal_nrf_tx_fifo_full(void);

// ==================================================================
/// @brief  : 获取接收FIFO的状态
///
/// @returns: 0x00 RX FIFO NOT empty, but NOT full
/// @returns: 0x01 RX FIFO empty
/// @returns: 0x02 RX FIFO full
// ==================================================================
uint8_t hal_nrf_get_rx_fifo_status(void);

// ==================================================================
/// @brief  : 获取FIFO的状态
///
/// @returns: 返回FIFO寄存器的状态
// ==================================================================
uint8_t hal_nrf_get_fifo_status(void);

// ==================================================================
/// @brief  : 检测接收FIFO是否为空
///
/// @returns: FALSE RX FIFO NOT empty,TRUE RX FIFO empty
// ==================================================================
bool hal_nrf_rx_fifo_empty(void);

// ==================================================================
/// @brief  : 检测接收FIFO是否为满
///
/// @returns: FALSE RX FIFO NOT full,TRUE RX FIFO full
// ==================================================================
bool hal_nrf_rx_fifo_full(void);

// ==================================================================
/// @brief  : 获取无线电的发射尝试状态
///
/// @returns: 尝试重新发送计数器
// ==================================================================
uint8_t hal_nrf_get_transmit_attempts(void);

// ==================================================================
/// @brief  : 获取载波检测标志
///
/// @returns: FALSE 未检测到, TRUE 检测到
// ==================================================================
bool hal_nrf_get_carrier_detect(void);

// ==================================================================
/// @brief  : 获取RX数据源
///
/// @returns: 当前数据包的管道数
// ==================================================================
uint8_t hal_nrf_get_rx_data_source(void);

// ==================================================================
/// @brief  : 读取RX有效数据
///
/// @param  : rx_pload 包缓存
///
/// @returns: 数据长度
// ==================================================================
uint16_t hal_nrf_read_rx_payload(uint8_t *rx_pload);

// ==================================================================
/// @brief  : 发送数据
///
/// @param  : tx_pload 发送缓存
/// @param  : length 发送长度
// ==================================================================
void hal_nrf_write_tx_payload(const uint8_t *tx_pload, uint8_t length);

// ==================================================================
/// @brief  : 写TX负载不需要ACK
///
/// @param  : tx_pload 发送缓存
/// @param  : length 发送长度
// ==================================================================
void hal_nrf_write_tx_payload_noack(const uint8_t *tx_pload, uint8_t length);

// ==================================================================
/// @brief  : 重用tx数据，使用上个数据包重发
// ==================================================================
void hal_nrf_reuse_tx(void);

// ==================================================================
/// @brief  : 获取重用TX的状态
///
/// @returns: FALSE Not activated,TRUE Activated
// ==================================================================
bool hal_nrf_get_reuse_tx_status(void);

// ==================================================================
/// @brief  : 清理接收缓存
// ==================================================================
void hal_nrf_flush_rx(void);

// ==================================================================
/// @brief  : 清理发送缓存
// ==================================================================
void hal_nrf_flush_tx(void);

// ==================================================================
/// @brief  : 读取nrf状态寄存器。
///
/// @returns: 
// ==================================================================
uint8_t hal_nrf_nop(void);

// ==================================================================
/// @brief  : 实现连续载波传输
///
/// @param  : enable 开启或关闭
// ==================================================================
void hal_nrf_enable_continious_wave (bool enable);

#endif // HAL_NRF_H__
